﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using FrbaBus.Properties;
using System.Globalization;

namespace FrbaBus.CompraProducto
{
    public partial class FormCompraProducto : Form
    {
        private int butacasDisponibles; //Contiene las butacas disponibles del viaje seleccionado (Puede variar con el tiempo)
        private decimal kgsDisponibles; //Los Kg disponibles (Puede variar con el tiempo)
        private long codViaje;          //Contiene el código del viaje seleccionado
        private Constantes.ModoAbm modoABM = Constantes.ModoAbm.Ninguno;
        private int cantPasajeros; decimal cantKg;  //Cantidades que indico el cliente
        private Constantes.ComprasModoSelDNI modoSelDNI = Constantes.ComprasModoSelDNI.CargaPasajero;    //Indica si se trata de una carga de un pasajero, encomienda o seleccion del cliente que realizara el pago
        private bool hayDiscapacitado;          //Al finalizar la carga de pasajeros, almacena si hay alguno discapacitado

        private decimal precioBasePasaje;   //Precio base del viaje seleccionado
        private decimal precioBaseKg;       //Precio base del viaje seleccionado
        private int[] vecAcompaniante;   //Vector auxiliar para relacionar en la lista de acompañantes un item con la posicion en la tabla

        public bool esAdmin; //Indica si se logueo un administrador o sino es un cliente desde un kiosco, incialmente es True
        public long dniLogin;       //En caso que sea un cliente (edAdmin = false), almacena el dni

        //Constructor, (-1) si es admin
        public FormCompraProducto(long dniLogin)
        {
            InitializeComponent();

            //Derminar si es un cliente o un administrador
            this.dniLogin = dniLogin;
            if (dniLogin == -1)
                esAdmin = true;
            else
            {
                //Si es un cliente, solo permitir pago con tarjeta
                esAdmin = false;
                rdPagoEfectivo.Enabled = false;
                rdPagoTarjeta.Checked = true;
            }

            //Cargar datos para seleccionar viaje
            CrearColumnasTabla();
            CargarDatosFiltroViajes();
        }

        //Inicializar columnas
        private void CrearColumnasTabla()
        {
            //Tabla de viajes
            tablaViajes.Columns.Add("via_codigo", "CODIGO");
            tablaViajes.Columns.Add("serv_codigo", "SERVICIO");
            tablaViajes.Columns.Add("via_hora_salida", "HORA SALIDA");
            tablaViajes.Columns.Add("via_butacas_disponibles", "BUTACAS DISPONIBLES");
            tablaViajes.Columns.Add("via_kg_disponibles", "KG DISPONIBLES");

            //Tabla de pasajeros
            tablaPasajeros.Columns.Add("tipo", "TIPO");
            tablaPasajeros.Columns.Add("cli_dni", "DNI");
            tablaPasajeros.Columns.Add("cli_apellido", "APELLIDO");
            tablaPasajeros.Columns.Add("cli_nombre", "NOMBRE");
            tablaPasajeros.Columns.Add("cli_sexo", "SEXO");
            tablaPasajeros.Columns.Add("cli_fch_nacimiento", "FECHA NACIMIENTO");
            tablaPasajeros.Columns.Add("cli_direccion", "DIRECCION");
            tablaPasajeros.Columns.Add("cli_telefono", "TELEFONO");
            tablaPasajeros.Columns.Add("cli_mail", "MAIL");
            tablaPasajeros.Columns.Add("cli_discapacitado", "DISCAPACITADO");
            tablaPasajeros.Columns.Add("cli_jubilado", "JUBILADO");
            tablaPasajeros.Columns.Add("but_codigo", "ASIENTO");        //Si es encomienda el valor es "-"
            tablaPasajeros.Columns.Add("but_tipo", "TIPO");             //Si es encomienda el valor es "-"
            tablaPasajeros.Columns.Add("but_piso", "PISO");             //Si es encomienda el valor es "-"
            tablaPasajeros.Columns.Add("enc_peso", "KG ENCOMIENDA");    //Si es pasajero el valor es "-"

            //Tabla de butacas
            tablaButaca.Columns.Add("but_codigo", "ASIENTO");
            tablaButaca.Columns.Add("but_tipo", "TIPO");
            tablaButaca.Columns.Add("but_piso", "PISO");
            tablaButaca.Columns.Add("but_sel", "SELECCIONADO");

            //Tabla de detalles de pago
            tablaDetallePago.Columns.Add("tipo", "TIPO");
            tablaDetallePago.Columns.Add("cli_dni", "DNI");
            tablaDetallePago.Columns.Add("cli_alias", "APELLIDO Y NOMBRE");
            tablaDetallePago.Columns.Add("cli_discapacitado", "DISCAPACITADO");
            tablaDetallePago.Columns.Add("cli_jubilado", "JUBILADO");
            tablaDetallePago.Columns.Add("enc_peso", "KG ENCOMIENDA");
            tablaDetallePago.Columns.Add("bonificacion", "BONIFICACION");
            tablaDetallePago.Columns.Add("precio", "PRECIO");

            //Tabla de comprobante
            tablaComprobante.Columns.Add("tipo", "TIPO");
            tablaComprobante.Columns.Add("cli_dni", "DNI");
            tablaComprobante.Columns.Add("but_codigo", "ASIENTO");        //Si es encomienda el valor es "-"
            tablaComprobante.Columns.Add("but_tipo", "TIPO");             //Si es encomienda el valor es "-"
            tablaComprobante.Columns.Add("but_piso", "PISO"); 
            tablaComprobante.Columns.Add("enc_peso", "KG ENCOMIENDA");
            tablaComprobante.Columns.Add("precio", "PRECIO");
            tablaComprobante.Columns.Add("coit_codigo", "CODIGO PASAJE");
        }

        //Carga los datos en los combos
        private void CargarDatosFiltroViajes()
        {
            string query;

            cbFiltroOrigen.Items.Clear();
            cbFiltroDestino.Items.Clear();

            query = "SELECT ciu_nombre FROM THE_BEST_IAS.ciudades ORDER BY 1";

            SqlDataReader dr = DbHelper.ExecuteQuery(query);

            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    cbFiltroOrigen.Items.Add(dr["ciu_nombre"].ToString().Trim());
                    cbFiltroDestino.Items.Add(dr["ciu_nombre"].ToString().Trim());
                }
            }
        }

        private void buSelFecha_Click(object sender, EventArgs e)
        {
            calendarioViaje.Visible = true;
            calendarioViaje.Focus();
        }

        private void calendarioViaje_DateChanged(object sender, DateRangeEventArgs e)
        {
            //Obtener la fecha
            txFechaViaje.Text = calendarioViaje.SelectionEnd.ToShortDateString();
        }

        private void calendarioViaje_Leave(object sender, EventArgs e)
        {
            //Hacer invisible si pierde el foco
            calendarioViaje.Hide();
        }

        private void buLimpiarFiltro_Click(object sender, EventArgs e)
        {
            //Actualizar los combos
            CargarDatosFiltroViajes();

            cbFiltroOrigen.SelectedItem = null;
            cbFiltroDestino.SelectedItem = null;
            txFechaViaje.Text = "";
        }

        private void buBuscar_Click(object sender, EventArgs e)
        {
            String MsjErrores = "";

            tablaViajes.Rows.Clear();

            //Validar datos
            if (cbFiltroOrigen.SelectedIndex == -1)
                MsjErrores += "\nDebe seleccionar la ciudad de origen";

            if (cbFiltroDestino.SelectedIndex == -1)
                MsjErrores += "\nDebe seleccionar la ciudad de destino";

            if (txFechaViaje.Text == "")
                MsjErrores += "\nDebe seleccionar una fecha";

            //Informar en caso de error
            if (MsjErrores != "")
            {
                MessageBox.Show("Se encontraron los siguientes errores:" + MsjErrores);
                return;
            }


            //Stored Procedure
            string sConnectionString = Settings.Default.GD1C2013ConnectionString;
            SqlConnection connection = new SqlConnection(sConnectionString);
            SqlCommand cmd = new SqlCommand("THE_BEST_IAS.pr_viajes_disponibles", connection);

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@p_via_fecha_salida", SqlDbType.Date)).Value = txFechaViaje.Text;
            cmd.Parameters.Add(new SqlParameter("@p_ciu_nombre_origen", SqlDbType.NVarChar)).Value = cbFiltroOrigen.SelectedItem.ToString();
            cmd.Parameters.Add(new SqlParameter("@p_ciu_nombre_destino", SqlDbType.NVarChar)).Value = cbFiltroDestino.SelectedItem.ToString();

            connection.Open();

            SqlDataReader dr = cmd.ExecuteReader();

            //Mostrar datos
            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    tablaViajes.Rows.Add(new object[] { 
                           dr["via_codigo"].ToString().Trim(), 
                           dr["serv_nombre"].ToString().Trim(),
                           dr["via_hora_salida"].ToString().Trim(),
                           dr["via_butacas_disponibles"].ToString().Trim(),
                           dr["via_kg_disponibles"].ToString().Trim()
                         });
                }
            }
            else
            {
                MessageBox.Show("No se encontraron datos", "INFORMACION");
            }

            connection.Close();
        }

        private void buSeleccionarViaje_Click(object sender, EventArgs e)
        {
            string msjError="";

            //Obtener datos del viaje seleccionado
            if (tablaViajes.SelectedRows.Count > 0)
            {
                codViaje = long.Parse(tablaViajes.SelectedRows[0].Cells[0].Value.ToString());
                butacasDisponibles = int.Parse(tablaViajes.SelectedRows[0].Cells[3].Value.ToString());
                kgsDisponibles = decimal.Parse(tablaViajes.SelectedRows[0].Cells[4].Value.ToString());

                //Validar entradas
                if (int.TryParse(txCantPasajViaje.Text,out cantPasajeros))
                {
                    if (butacasDisponibles < cantPasajeros)
                    {
                        msjError += "\nEl micro del viaje seleccionado no tiene la cantidad suficiente de butacas disponibles.";
                    }
                }
                if (decimal.TryParse(txCantKgViaje.Text, out cantKg))
                {
                    if (kgsDisponibles < cantKg)
                    {
                        msjError += "\nEl micro del viaje seleccionado no tiene la capacidad suficiente para las encomiendas.";
                    }
                }

                //Actualizar cuadro General
                lbGralViaje.Text = "Origen: " + cbFiltroOrigen.SelectedItem + "\nDestino: " + cbFiltroDestino.SelectedItem + "\n" +
                    txFechaViaje.Text + " - " + tablaViajes.SelectedRows[0].Cells["via_hora_salida"].Value.ToString();

                lbGralKg.Text = cantKg.ToString() + " Kgs";
                lbGralPasajeros.Text = cantPasajeros.ToString() + " Pasajes";


                if (msjError == "")
                {
                    //Habilitar los controles para cargar pasajeros
                    if (obtenerPrecioBasePasaje())
                        HabilitarEtapaPasajeros();
                }
                else
                {
                    MessageBox.Show("Se encontraron los siguientes errores:" + msjError, "Seleccionar Viaje");
                }
            }
        }

        //Habilita los controles para cargar los pasajeros (Se necesita haber seleccionado un viaje previamente)
        private void HabilitarEtapaPasajeros()
        {
            frDatosPasajero.Enabled = true;
            frPasajeros.Enabled = true;
            tablaPasajeros.Enabled = true;

            //No permitir cambiar el viaje
            buSeleccionarViaje.Enabled = false;
            buBuscar.Enabled = false;
            buLimpiarFiltro.Enabled = false;
            tablaViajes.Enabled = false;
            frViajes.Enabled = false;

            grSelViaje.Visible = false;
            grSelPasajes.Visible = true;
        }

        private void buAltaPasajero_Click(object sender, EventArgs e)
        {
            //Habilitar los controles para ingresar el dni
            txDni.Enabled = true;
            buAgregarPasajeroTabla.Enabled = true;
            buModifDatos.Enabled = true;
            buSelAsientoPasajero.Enabled = true;

            //Cargar butacas del micro
            cargarDatosButacas();
            grSelButaca.Visible = true;

            txDni.Focus();
            buAgregarPasajero.Enabled = false;
        }

        private void buAgregarPasajeroTabla_Click(object sender, EventArgs e)
        {
            //Boton 'Aceptar', agrega el DNI ingresado en la tabla de pasajeros
            long dni = 0;
            string query;
            string cadenaJubilado;
            string valorSexo;
            string valorDiscapacitado;
            string ValorFechaNac;
            string msjErrores = "";
            decimal valorKg;

            SqlDataReader dr;


            //Validar datos
            bool resultado = long.TryParse(txDni.Text, out dni);
            if (!resultado)
            {
                msjErrores += "\nEl DNI no es válido";
            }
            else
            {
                if (dni < 1000000)
                {
                    msjErrores += "\nEl DNI debe ser de mínimo 7 digitos";
                }
            }

            if (modoSelDNI == Constantes.ComprasModoSelDNI.CargaPasajero && txAsientoPasajeroCod.Text == "")
                msjErrores += "\nSeleccione una butaca disponible";

            if (modoSelDNI == Constantes.ComprasModoSelDNI.CargaEncomienda)
            {
                if (!decimal.TryParse(txAgEnc_Kg.Text, out valorKg))
                {
                    msjErrores += "\nLa cantidad de kg no es un número válido";
                }
                else
                {
                    if (valorKg <= 0)
                        msjErrores += "\nLa cantidad de kg debe ser mayor a cero";
                }
            }

            //Informar en caso de error
            if (msjErrores != "")
            {
                MessageBox.Show("Se encontraron los siguientes errores:" + msjErrores);
                return;
            }

            //Crear consulta
            query = "select * from THE_BEST_IAS.clientes where usu_codigo = " + txDni.Text;

            //Consultar
            dr = DbHelper.ExecuteQuery(query);

            if (dr.HasRows)
            {
                dr.Read();

                //Determinar si tiene el campo sexo
                valorSexo = dr["cli_sexo"].ToString().Trim();
                if (valorSexo == "")
                {
                    MessageBox.Show("La persona indicada no tiene el campo sexo, actualicelo para continuar.");
                    txDni.Focus();
                    return;
                }

                //Determinar el modo                
                switch (modoSelDNI)
                    {
                    case Constantes.ComprasModoSelDNI.CargaPasajero:

                        //Si esta discapacitado, verificar que no haya otro discapacitado cargado
                        if (regClienteEsDiscapacitado(dr) && hayUnDiscapacitadoEnTabla())
                        {
                            //Se encontro otro discapacitado, informar y salir
                            MessageBox.Show("No se permiten dos discapacitados en la misma compra, debe cargarse en otra compra distinta.", "Pasajeros");
                            txDni.Focus();
                            return;
                        }

                        //Calcula en base al sexo y fecha de nacimiento si el cliente es jubilado
                        cadenaJubilado = regClienteEsJubiladoStr(dr);

                        //Valor del campo discapacitado
                        valorDiscapacitado = regClienteEsDiscapacitadoStr(dr);

                        //Valor del campo fecha de nacimiento
                        ValorFechaNac = DateTime.Parse(dr["cli_fch_nacimiento"].ToString().Trim()).ToShortDateString();

                        //Marcar la butaca como ya asignada en la tabla de butacas
                        asignarButaca(dr);

                        //Agregar a la tabla
                        tablaPasajeros.Rows.Add(new object[] { 
                                "Pasajero",    
                                dr["usu_codigo"].ToString().Trim(), 
                               dr["cli_apellido"].ToString().Trim(),
                               dr["cli_nombre"].ToString().Trim(),
                               valorSexo,
                               ValorFechaNac,
                               dr["cli_direccion"].ToString().Trim(), 
                               dr["cli_telefono"].ToString().Trim(),
                               dr["cli_mail"].ToString().Trim(),
                               valorDiscapacitado,
                               cadenaJubilado,
                               txAsientoPasajeroCod.Text,
                               txAsientoPasajeroTipo.Text,
                               txAsientoPasajeroPiso.Text,
                               "-"                              //Kgs no disponible
                             });

                        //Limpiar datos
                        limpiarDatosIngresoPasajero();

                        break;
                    case Constantes.ComprasModoSelDNI.CargaEncomienda:
                          
                        //Valor del campo fecha de nacimiento
                        ValorFechaNac = DateTime.Parse(dr["cli_fch_nacimiento"].ToString().Trim()).ToShortDateString();

                        //Agregar a la tabla
                        tablaPasajeros.Rows.Add(new object[] { 
                               "Encomienda",    
                               dr["usu_codigo"].ToString().Trim(), 
                               dr["cli_apellido"].ToString().Trim(),
                               dr["cli_nombre"].ToString().Trim(),
                               valorSexo,
                               ValorFechaNac,
                               dr["cli_direccion"].ToString().Trim(), 
                               dr["cli_telefono"].ToString().Trim(),
                               dr["cli_mail"].ToString().Trim(),
                               "-",                             //En la encomienda no es necesario saber si es discapacitado
                               "-",                             //En la encomienda no es necesario saber si es jubilado
                               "-",                             //No se asigna butacas para encomiendas
                               "-",                             //No se asigna butacas para encomiendas
                               "-",                             //No se asigna butacas para encomiendas
                               txAgEnc_Kg.Text
                             });

                        //Limpiar datos
                        limpiarDatosIngresoPasajero();

                        break;
                    case Constantes.ComprasModoSelDNI.SeleccionPago:
                        //Usuario que paga
                        lbGralClientePago.Text = dr["cli_apellido"].ToString().Trim() + ", " + dr["cli_nombre"].ToString().Trim();

                        //Cargar datos en el frame de pagos
                        txPagoApeNom.Text = lbGralClientePago.Text;
                        txPagoDni.Text = txDni.Text.Trim();

                        //Cargar detalles de pago
                        cargarDetallesPago();

                        //Muestra los controles para realizar el pago
                        grSelPasajes.Visible = false;
                        grDatosPago.Visible = true;

                        break;
                    }
 
            }else{
                DialogResult resultadoMsj = MessageBox.Show("El dni ingresado no esta registrado\n¿Desea registrarlo?", "INFORMACION", MessageBoxButtons.YesNo);
                if (resultadoMsj == DialogResult.Yes)
                {
                    //Habilitar los botones para agregar
                    modoABM = Constantes.ModoAbm.Alta;
                    buLimpiarPasajero_Click(null, null);
                    habilitarEdicionPasajero(true);
                    buAgregarPasajero.Enabled = false;
                }
                else
                {
                    txDni.Focus();
                }
            }

        }

        private void calendarioNac_DateChanged(object sender, DateRangeEventArgs e)
        {
            //Obtener la fecha
            txFechaNac.Text = calendarioNac.SelectionEnd.ToShortDateString();
        }

        private void calendarioNac_Leave(object sender, EventArgs e)
        {
            //Hacer invisible si pierde el foco
            calendarioNac.Hide();
        }

        private void buModifDatos_Click(object sender, EventArgs e)
        {
            long dni = 0;
            string query;
            SqlDataReader dr;
            string datoLeido;
            DateTime fechaNac;

            modoABM = Constantes.ModoAbm.Modificacion;

            //Validar datos
            bool resultado = long.TryParse(txDni.Text, out dni);
            if (!resultado)
            {
                MessageBox.Show("El DNI no es válido.","Modificar datos");
                txDni.Focus();
                return;
            }
            else
            {
                if (dni < 1000000)
                {
                    MessageBox.Show("\nEl DNI debe ser de mínimo 7 digitos","Modificar datos");
                }
            }

            //Crear consulta
            query = "select * from THE_BEST_IAS.clientes where usu_codigo = " + txDni.Text;

            //Consultar
            dr = DbHelper.ExecuteQuery(query);

            if (dr.HasRows)
            {
                dr.Read();
                txNombre.Text = dr["cli_nombre"].ToString().Trim();
                txApellido.Text = dr["cli_apellido"].ToString().Trim();
                txDireccion.Text = dr["cli_direccion"].ToString().Trim();
                txTelefono.Text = dr["cli_telefono"].ToString().Trim();
                txEmail.Text = dr["cli_mail"].ToString().Trim();
                
                fechaNac = DateTime.Parse(dr["cli_fch_nacimiento"].ToString().Trim());
                txFechaNac.Text = fechaNac.ToShortDateString();     //Convertir fecha a cadena


                datoLeido = dr["cli_sexo"].ToString().Trim();
                if (datoLeido == "")
                {
                    cbSexo.SelectedIndex = 2;   //Elemento 2: "No seleccionado"
                }
                else
                {
                    if (datoLeido == "M")
                    {
                        cbSexo.SelectedIndex = 1;   //Elemento 1: "Masculino"
                    }
                    else
                    {
                        cbSexo.SelectedIndex = 0;   //Elemento 0: "Femenino"
                    }
                }

                datoLeido = dr["cli_discapacitado"].ToString().Trim();
                if (datoLeido == "0")
                    {
                        cbDiscapacitado.SelectedIndex = 1;   //Elemento 1: "No"
                    }
                    else
                    {
                        cbDiscapacitado.SelectedIndex = 0;   //Elemento 0: "Si"
                }
            }
            else
            {
                //Si no existe informar si desea agregarlo
                DialogResult resultadoMsj = MessageBox.Show("El DNI ingresado esta registrado\n¿Desea registrarlo?", "INFORMACION", MessageBoxButtons.YesNo);
                if (resultadoMsj == DialogResult.No)
                {
                    txDni.Focus();
                    return;
                }
                else
                {
                    modoABM= Constantes.ModoAbm.Alta;
                }
            }
            //Habilitar controles para editar los datos
            habilitarEdicionPasajero(true);
            buAgregarPasajeroTabla.Enabled = false;
        }

        private void habilitarEdicionPasajero(bool habilitar)
        {
            //Habilita o no los controles para modificar los datos de los pasajeros
                txNombre.Enabled = habilitar;
                txApellido.Enabled = habilitar;
                cbSexo.Enabled = habilitar;
                buSelFechaNac.Enabled = habilitar;
                txDireccion.Enabled = habilitar;
                txTelefono.Enabled = habilitar;
                txEmail.Enabled = habilitar;
                cbDiscapacitado.Enabled = habilitar;
                buLimpiarPasajero.Enabled = habilitar;
                buGuardarPasajero.Enabled = habilitar;
                buCancelarPasajero.Enabled = habilitar;

            //No permitir modificar un dni
                txDni.Enabled = !habilitar;
        }

        private void buLimpiarPasajero_Click(object sender, EventArgs e)
        {
            //Limpiar los datos de edición de pasajero
            calendarioNac.Visible = false;
            txNombre.Text = "";
            txApellido.Text = "";
            cbSexo.SelectedIndex = -1;
            txDireccion.Text = "";
            txTelefono.Text = "";
            txEmail.Text = "";
            txFechaNac.Text = "";
            cbDiscapacitado.SelectedIndex = -1;
        }

        private void buGuardarPasajero_Click(object sender, EventArgs e)
        {
            String MsjErrores = "";
            long auxTelefono;

            txNombre.Text.Trim();
            if (txNombre.Text == "")
                MsjErrores += "\nIngrese el nombre del cliente";

            txApellido.Text.Trim();
            if (txApellido.Text == "")
                MsjErrores += "\nIngrese el apellido del cliente";

            if (cbSexo.SelectedIndex != 0 && cbSexo.SelectedIndex != 1) //Si no es F ni M
                MsjErrores += "\nSeleccione en el campo sexo, 'Masculino' o 'Femenino'";

            if (txFechaNac.Text == "")
                MsjErrores += "\nSeleccione la fecha de nacimiento";

            txDireccion.Text.Trim();
            if (txDireccion.Text == "")
                MsjErrores += "\nIngrese la dirección del cliente";

            if (!long.TryParse(txTelefono.Text, out auxTelefono))
                MsjErrores += "\nEl teléfono no es válido, debe ser numérico";

            if (cbDiscapacitado.SelectedIndex == -1)
                MsjErrores += "\nSeleccione si el cliente es discapacitado o no";


            //Informar en caso de error
            if (MsjErrores != "")
            {
                MessageBox.Show("Se encontraron los siguientes errores:" + MsjErrores);
                return;
            }

            // Stored Procedure
            string sConnectionString = Settings.Default.GD1C2013ConnectionString;
            SqlConnection connection = new SqlConnection(sConnectionString);

            //Según el caso que sea alta o modificación
            SqlCommand cmd;
            if (modoABM == Constantes.ModoAbm.Alta)
                cmd=new SqlCommand("THE_BEST_IAS.pr_alta_cliente2", connection);
            else
                cmd=new SqlCommand("THE_BEST_IAS.pr_modif_cliente", connection);

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@p_cli_dni", SqlDbType.BigInt)).Value = txDni.Text;
            cmd.Parameters.Add(new SqlParameter("@p_cli_nombre", SqlDbType.NVarChar)).Value = txNombre.Text;
            cmd.Parameters.Add(new SqlParameter("@p_cli_apellido", SqlDbType.NVarChar)).Value = txApellido.Text;
            cmd.Parameters.Add(new SqlParameter("@p_cli_fch_nacimiento", SqlDbType.Date)).Value = txFechaNac.Text;
            cmd.Parameters.Add(new SqlParameter("@p_cli_direccion", SqlDbType.NVarChar)).Value = txDireccion.Text;
            cmd.Parameters.Add(new SqlParameter("@p_cli_telefono", SqlDbType.BigInt)).Value = txTelefono.Text;
            cmd.Parameters.Add(new SqlParameter("@p_cli_mail", SqlDbType.NVarChar)).Value = txEmail.Text;

            if (cbSexo.SelectedIndex == 0)
            {
                cmd.Parameters.Add(new SqlParameter("@p_cli_sexo", SqlDbType.NVarChar)).Value = "F";
            }
            else
            {
                cmd.Parameters.Add(new SqlParameter("@p_cli_sexo", SqlDbType.NVarChar)).Value = "M";
            }

            if (cbDiscapacitado.SelectedIndex == 0)
            {
                cmd.Parameters.Add(new SqlParameter("@p_cli_discapacitado", SqlDbType.SmallInt)).Value = 1;
            }
            else
            {
                cmd.Parameters.Add(new SqlParameter("@p_cli_discapacitado", SqlDbType.SmallInt)).Value = 0;
            }

            connection.Open();

            //Conexión con BD
            if (cmd.ExecuteNonQuery() > 0)  //Ejecuta la consulta y devuelve la cant. de filas afectadas
            {
                MessageBox.Show("Cliente actualizado con éxito", "Actualizar Cliente");

                //Reestablecer controles
                buAgregarPasajeroTabla.Enabled = true;
                habilitarEdicionPasajero(false);
            }
            else
            {
                MessageBox.Show("No se pudo actualizar el cliente", "Actualizar Cliente");
            }

            connection.Close();
        }

        private void buCancelarPasajero_Click(object sender, EventArgs e)
        {
            //Cancela la edicion del pasajero y descarta los cambios realizados
            buLimpiarPasajero_Click(null, null);
            buAgregarPasajeroTabla.Enabled = true;
            habilitarEdicionPasajero(false);
        }

        private void buSelFechaNac_Click(object sender, EventArgs e)
        {
            calendarioNac.Visible = true;
            calendarioNac.Focus();
        }

        //Consultar butacas del viaje determinado
        private void cargarDatosButacas()
        {

            string sConnectionString = Settings.Default.GD1C2013ConnectionString;
            SqlConnection connection = new SqlConnection(sConnectionString);
            SqlCommand cmd = new SqlCommand("THE_BEST_IAS.pr_butacas_disponibles", connection);

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@p_via_codigo", SqlDbType.BigInt)).Value = codViaje;

            connection.Open();

            SqlDataReader dr = cmd.ExecuteReader();

            //Mostrar datos
            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    tablaButaca.Rows.Add(new object[] { 
                           dr["but_codigo"].ToString().Trim(), 
                           dr["but_tipo"].ToString().Trim(),
                           dr["but_piso"].ToString().Trim(),
                           "-"                                      //Indica que no fue reservado por un pasajero aún
                         });
                }
            }
            else
            {
                MessageBox.Show("No hay butacas disponibles", "INFORMACION");
            }

            connection.Close();
        }

        //Asigna la butaca seleccionada de la tabla para el próximo pasajero
        private void buSelAsientoPasajero_Click(object sender, EventArgs e)
        {
            //Determinar si hay un elemento seleccionado
            if (tablaButaca.SelectedRows.Count > 0)
            {
                //Determinar si el asiento esta libre
                if (tablaButaca.SelectedRows[0].Cells["but_sel"].Value.ToString() == "-")
                {
                    txAsientoPasajeroCod.Text = tablaButaca.SelectedRows[0].Cells["but_codigo"].Value.ToString();
                    txAsientoPasajeroTipo.Text = tablaButaca.SelectedRows[0].Cells["but_tipo"].Value.ToString();
                    txAsientoPasajeroPiso.Text = tablaButaca.SelectedRows[0].Cells["but_piso"].Value.ToString();
                }
                else
                {
                    MessageBox.Show("La butaca fue asignado a otro pasajero de la compra.", "Seleccion de butacas");
                }
            }
            else
            {
                MessageBox.Show("Seleccione una butaca libre.", "Seleccion de butacas");
            }
        }

        private void buQuitarPasajero_Click(object sender, EventArgs e)
        {
            string strCodButaca;

            //Determinar si hay un elemento seleccionado
            if (tablaPasajeros.SelectedRows.Count > 0)
            {
                //Obtener la butaca asignada para poder liberarla
                strCodButaca = tablaPasajeros.SelectedRows[0].Cells["but_codigo"].Value.ToString();

                if (strCodButaca != "-")
                {
                    //Se trata de un pasajero, buscar y liberar butaca
                    for (int x = 0; x < tablaButaca.Rows.Count; x++)
                    {
                        if (tablaButaca.Rows[x].Cells["but_codigo"].Value.ToString() == strCodButaca)
                        {
                            //Se encontro, actualizar
                            tablaButaca.Rows[x].Cells["but_sel"].Value = "-";
                            break;
                        }
                    }
                }

                //Quitar fila seleccionada
                tablaPasajeros.Rows.Remove(tablaPasajeros.SelectedRows[0]);
            }
            else
            {
                MessageBox.Show("Seleccione un pasajero/encomienda.", "Quitar de la lista");
            }
        }

        //Indicar que se finalizó la carga de pasajeros
        private void buFinalizarCargaPasajeros_Click(object sender, EventArgs e)
        {
            int cantPasajerosTabla;
            decimal kgEncomiendasTabla;
            string msjError="";

            //Controlar que haya al menos un pasajero o una encomienda
            if (tablaPasajeros.Rows.Count == 0)
            {
                MessageBox.Show("La compra no tiene pasajeros ni encomiendas cargadas.", "Compra");
                return;
            }

            //Calcular la cantidad de pasajeros y Kg de encomiendas total
            calcularCantPasajEnc(out cantPasajerosTabla, out kgEncomiendasTabla, out hayDiscapacitado);

            if (cantPasajerosTabla != cantPasajeros)
            {
                msjError += "\nLa cantidad de pasajeros cargados no coincide con la indicada inicialmente";
            }

            if (kgEncomiendasTabla != cantKg)
            {
                msjError += "\nLa cantidad de Kg cargados no coincide con la indicada inicialmente";
            }

            //Informar en caso de no coincidir las cantidades y consultar al usuario si mantener o no los cambios
            if (msjError != "")
            {
                if (MessageBox.Show("Se encontraron los siguientes errores:" + msjError + "\n¿Desea continuar de todos modos?", "Compra", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    //Selecciono que no
                    return;
                }
                else
                {
                    //Determinar que la cantidad de kg no supere la capacidad disponible del micro
                    if (kgsDisponibles < kgEncomiendasTabla)
                    {
                        MessageBox.Show("La cantidad de kgs total de encomiendas supera la cantidad disponible del micro (" + kgsDisponibles.ToString() + ")", "Error");
                        return;
                    }

                    //Actualizar la cantidad de pasajeros y kg de encomiendas
                    cantPasajeros = cantPasajerosTabla;
                    lbGralPasajeros.Text = cantPasajeros.ToString() + " Pasajes";
                    cantKg = kgEncomiendasTabla;
                    lbGralKg.Text = kgEncomiendasTabla + " Kgs";
                }
            }

            //Deshabilitar los controles para carga de pasajeros
            frPasajeros.Enabled = false;
            tablaPasajeros.Enabled = false;

            grClientePaga.Visible = true;
            grClientePaga.Size = new Size(628,220);
            modoSelDNI = Constantes.ComprasModoSelDNI.SeleccionPago;    //Modo selección

            buSelAsientoPasajero.Visible = false;
            txAsientoPasajeroCod.Visible = false;
            txAsientoPasajeroPiso.Visible = false;
            txAsientoPasajeroTipo.Visible = false;
            lbPasajero1.Visible = false;
            lbPasajero2.Visible = false;
            lbPasajero3.Visible = false;
            txAgEnc_Kg.Visible = false;
            lbEncomienda.Visible = false;
            rdEncomienda.Visible = false;
            rdPasajero.Visible = false;

            grSelButaca.Visible = false;

            //Cargar pasajeros de la tabla en la lista para elegir quien debe pagar
            cargarListaPago();

            //Mostrar el dni del cliente que se logueo en el cuadro a seleccionar, si corresponde
            if (!esAdmin)
                txDni.Text = dniLogin.ToString();
        }

        //Habilita los controles para seleccionar la butaca del pasajero
        private void rdPasajero_CheckedChanged(object sender, EventArgs e)
        {
            if (rdPasajero.Checked == true)
            {
                HabilitarModoPasajero(true);
                modoSelDNI = Constantes.ComprasModoSelDNI.CargaPasajero;
            }
        }

        //Habilita los controles para indicar la cantidad de kg de la encomienda
        private void rdEncomienda_CheckedChanged(object sender, EventArgs e)
        {
            if (rdEncomienda.Checked == true)
            {
                HabilitarModoPasajero(false);
                modoSelDNI = Constantes.ComprasModoSelDNI.CargaEncomienda;
            }
        }

        //Carga de pasajeros/encomiendas:
        //Habilita los controles para cargar pasajeros, en caso de falso para cargar kgs de encomiendas
        //No limpia los contenidos de los controles
        private void HabilitarModoPasajero(bool valor)
        {
            lbPasajero1.Visible = valor;
            lbPasajero2.Visible = valor;
            lbPasajero3.Visible = valor;
            txAsientoPasajeroCod.Visible = valor;
            txAsientoPasajeroTipo.Visible = valor;
            txAsientoPasajeroPiso.Visible = valor;
            buSelAsientoPasajero.Visible = valor;

            lbEncomienda.Visible = !valor;
            txAgEnc_Kg.Visible = !valor;
        }

        //Acepta un registro de cliente y devuelve un boolean si es discapacitado o no
        private bool regClienteEsDiscapacitado(SqlDataReader dr)
        {
            if (dr["cli_discapacitado"].ToString().Trim() == "1")
                return true;
            else
                return false;
        }

        //Acepta un registro de cliente y devuelve una cadena con "Si" o "No" si es discapacitado o no
        private string regClienteEsDiscapacitadoStr(SqlDataReader dr)
        {
            if (dr["cli_discapacitado"].ToString().Trim() == "1")
                return "Si";
            else
                return "No";
        }
        
        //Acepta un registro de cliente y devuelve una cadena con "Si" o "No" si es jubilado o no
        private string regClienteEsJubiladoStr(SqlDataReader dr)
        {
            DateTime auxFechaNac;
            int edad;
            string strSexo;

            auxFechaNac = DateTime.Parse(dr["cli_fch_nacimiento"].ToString().Trim());
            strSexo = dr["cli_sexo"].ToString().Trim();

            //Calcular la edad en base a la fecha de nacimiento
            edad = Constantes.calcularEdad(auxFechaNac);

            //Determinar si esta jubilado
            if (strSexo == "M" && edad >= 65)
            {
                return "Si";
            }
            else if (strSexo == "F" && edad >= 60)
            {
                return "Si";
            }
            else
            {
                return "No";
            }
        }

        //Recorre la tabla de pasajeros/encomiendas y devuelve true si hay un discapacitado cargado
        private bool hayUnDiscapacitadoEnTabla(){
                            //Recorrer la tabla buscando si hay otro discapacitado
                            for (int x = 0; x < tablaPasajeros.Rows.Count; x++)
                            {
                                //Los pasajeros no tienen kg de encomiendas
                                if (tablaPasajeros.Rows[x].Cells["enc_peso"].Value.ToString() == "-")
                                {
                                    if (tablaPasajeros.Rows[x].Cells["cli_discapacitado"].Value.ToString().ToUpper() == "SI")
                                    {
                                        //Se encontro un pasajero discapacitado
                                        return true;
                                    }
                                }
                            }
            return false;
        }

        //Recibe un registro de cliente, marca en la tabla de butacas el registro como asignado al cliente
        private void asignarButaca(SqlDataReader dr)
        {
            //Marcar la butaca como ya asignada en la tabla de butacas
            for (int x = 0; x < tablaButaca.Rows.Count; x++)
            {
                if (tablaButaca.Rows[x].Cells["but_codigo"].Value.ToString() == txAsientoPasajeroCod.Text)
                {
                    tablaButaca.Rows[x].Cells["but_sel"].Value = dr["cli_apellido"].ToString().Trim() + ", " + dr["cli_nombre"].ToString().Trim();
                    break;
                }
            }
        }

        //Borra las entradas de los pasajeros o encomiendas a cargar en la tabla
        private void limpiarDatosIngresoPasajero()
        {
            //Borrar datos mostrados
            txDni.Text = "";
            buLimpiarPasajero_Click(null, null);
            txAsientoPasajeroCod.Text = "";
            txAsientoPasajeroPiso.Text = "";
            txAsientoPasajeroTipo.Text = "";
            txAgEnc_Kg.Text = "0";
        }

        //Devuelve por parametros la cantidad de pasajeros y Kg de encomiendas de la tabla
        private void calcularCantPasajEnc(out int cantPasajeros, out decimal cantKg, out bool hayDiscap)
        {
            cantPasajeros = 0;
            cantKg = 0;
            hayDiscap = false;

            //Recorrer y procesar la tabla
            for (int x = 0; x < tablaPasajeros.Rows.Count; x++)
            {
                //Determinar si es una encomienda o pasaje
                if (tablaPasajeros.Rows[x].Cells["but_codigo"].Value.ToString() == "-")
                {
                    //Se trata de una encomienda, sumar Kg
                    cantKg += decimal.Parse(tablaPasajeros.Rows[x].Cells["enc_peso"].Value.ToString());
                }else{
                    //Se trata de un pasajero
                    cantPasajeros +=1;
                    //Determinar si hay un discapacitado
                    if (tablaPasajeros.Rows[x].Cells["cli_discapacitado"].Value.ToString().ToUpper() == "SI")
                    {
                        hayDiscap = true;
                    }
                }
            }
        }

        //Consulta el precio base del viaje seleccionado y lo carga en las variables
        private bool obtenerPrecioBasePasaje(){

            //Stored Procedure
            string sConnectionString = Settings.Default.GD1C2013ConnectionString;
            SqlConnection connection = new SqlConnection(sConnectionString);
            SqlCommand cmd = new SqlCommand("THE_BEST_IAS.pr_precio_base", connection);
            bool resultado;

            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@p_via_codigo", SqlDbType.BigInt)).Value = codViaje;
            connection.Open();
            SqlDataReader dr = cmd.ExecuteReader();

            //Leer datos
            if (dr.HasRows)
            {
                dr.Read();

                precioBasePasaje = decimal.Parse(dr["rec_precio_base_pasaje"].ToString());
                precioBaseKg = decimal.Parse(dr["rec_precio_base_encomienda"].ToString());
                resultado = true;
            }
            else
            {
                MessageBox.Show("Error al consultar los precios base del viaje seleccionado", "Error");
                precioBasePasaje=0;
                precioBaseKg=0;
                resultado = false;
            }
            connection.Close();

            return resultado;
        }

        //Carga los pasajes y encomiendas a la tabla de detalles de pago y calculas los precios
        //Casos especiales:
            //No se aplica ningun tipo de beneficio a las encomiendas
            //Los jubilados pagan el 50% del pasaje
            //Si viaja solo un discapacitado paga normal (50% si es jubilado tambien)
            //Si viaja un discapacitado y un no discapacitado, se permite elegir a uno para que no pague
            //Si viaja un discapacitado y mas de un no discapacitado, el discapacitado no paga y se permite elegir a un no discapacitado(Acompañante) para que no pague
        private void cargarDetallesPago()
        {
            decimal precioLinea;
            int filaDiscapacitado;     //En caso de haber un discapacitado, contiene la fila de la tabla donde se encuentra
            int y=0;                      //Indice del vector auxiliar de acompañantes
            cbAcompanianteDiscap.Items.Clear();
            decimal precioTotal=0;

            //Preparar la lista de seleccion de acompañante, en el caso que haya un discapacitado
            if (hayDiscapacitado && cantPasajeros == 2)
            {
                //Permitir elegir entre el discapacitado y el acompañante
                vecAcompaniante = new int[2];
                lbAcompaniante.Visible = true;
                cbAcompanianteDiscap.Visible = true;
                buConfAcompaniante.Visible = true;
                buConfimarCompra.Enabled = false;
            }
            else if (hayDiscapacitado && cantPasajeros > 2)
            {
                //Permitir elegir un acompañante, pero no incluir en la lista al discapacitado
                vecAcompaniante = new int[cantPasajeros-1];
                lbAcompaniante.Visible = true;
                cbAcompanianteDiscap.Visible = true;
                buConfAcompaniante.Visible = true;
                buConfimarCompra.Enabled = false;
            }


            //Recorrer y procesar la tabla de pasajeros/encomiendas
            for (int x = 0; x < tablaPasajeros.Rows.Count; x++)
            {
                //Determinar si es una encomienda o pasaje
                if (tablaPasajeros.Rows[x].Cells["but_codigo"].Value.ToString() == "-")
                {
                    precioLinea = decimal.Parse(tablaPasajeros.Rows[x].Cells["enc_peso"].Value.ToString()) * precioBaseKg;

                    //Cargar registro de encomienda
                    tablaDetallePago.Rows.Add(new object[] { 
                           tablaPasajeros.Rows[x].Cells["tipo"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["cli_dni"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["cli_apellido"].Value.ToString() + ", " + tablaPasajeros.Rows[x].Cells["cli_nombre"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["cli_discapacitado"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["cli_jubilado"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["enc_peso"].Value.ToString(),
                            "-" ,                           //Las encomiendas no tiene bonificaciones
                            precioLinea.ToString()
                         });
                    precioTotal += precioLinea;
                }
                else
                {
                    string strPromocion="-";

                    //Se trata de un pasajero
                    precioLinea = precioBasePasaje;

                    //Si es jubilado, se descuenta el 50%
                    if (tablaPasajeros.Rows[x].Cells["cli_jubilado"].Value.ToString().ToUpper() == "SI")
                    {
                        strPromocion = "Desc. 50% por Jubilado";
                        precioLinea = precioLinea / 2;
                    }

                    //Si hay discapacitado y un acompañante agregar a la tabla ambos
                    if (hayDiscapacitado && cantPasajeros == 2)
                    {
                        vecAcompaniante[y] = x;
                        y += 1;
                        cbAcompanianteDiscap.Items.Add(tablaPasajeros.Rows[x].Cells["cli_apellido"].Value.ToString() + 
                            ", " + tablaPasajeros.Rows[x].Cells["cli_nombre"].Value.ToString());
                    } if (hayDiscapacitado && cantPasajeros > 2)
                    {
                        //Se agrega los pasajeros no discapacitados
                        if (tablaPasajeros.Rows[x].Cells["cli_discapacitado"].Value.ToString().ToUpper() != "SI")
                        {
                            vecAcompaniante[y] = x;
                            y += 1;
                            cbAcompanianteDiscap.Items.Add(tablaPasajeros.Rows[x].Cells["cli_apellido"].Value.ToString() +
                                ", " + tablaPasajeros.Rows[x].Cells["cli_nombre"].Value.ToString());
                        }
                    }


                    //Si es discapacitado verificar si es el unico
                    if (tablaPasajeros.Rows[x].Cells["cli_discapacitado"].Value.ToString().ToUpper() == "SI")
                    {
                        //Registrar la fila donde esta el discapacitado
                        filaDiscapacitado = x;

                        //Tomar medidas dependiendo de la cantidad de pasajeros que haya
                        if (cantPasajeros > 2)
                        {
                            //Si hay 3 o mas pasajeros, el discapacitado automaticamente no paga
                            precioLinea = 0;
                            strPromocion = "Pasaje sin cargo por discapacidad";
                        }
                    }

                    //Cargar registro de encomienda
                    tablaDetallePago.Rows.Add(new object[] { 
                           tablaPasajeros.Rows[x].Cells["tipo"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["cli_dni"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["cli_apellido"].Value.ToString() + ", " + tablaPasajeros.Rows[x].Cells["cli_nombre"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["cli_discapacitado"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["cli_jubilado"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["enc_peso"].Value.ToString(),
                           strPromocion,
                           precioLinea.ToString()
                         });
                    precioTotal += precioLinea;
                }
            }

            txPagoPrecioTotal.Text = precioTotal.ToString("#.##");    //Formatear precio, mostrar solo 2 decimales
        }

        private void rdPagoEfectivo_CheckedChanged(object sender, EventArgs e)
        {
            //Ocultar el frame para introducir datos de la tarjeta
            if (rdPagoEfectivo.Checked)
            {
                grCompraTarj.Visible = false;
            }
        }

        private void rdPagoTarjeta_CheckedChanged(object sender, EventArgs e)
        {
            //Mostrar el frame para introducir datos de la tarjeta
            if (rdPagoTarjeta.Checked)
            {
                grCompraTarj.Visible = true;
            }
        }

        private void buConfAcompaniante_Click(object sender, EventArgs e)
        {
            //Validar que se haya seleccionado un pasajero
            if (cbAcompanianteDiscap.SelectedIndex == -1)
            {
                MessageBox.Show("Seleccione un pasajero para que viaje sin cargo.", "Selección de acompañande de discapacitado");
                return;
            }

            //Actualizar la tabla
            if (tablaDetallePago.Rows[vecAcompaniante[cbAcompanianteDiscap.SelectedIndex]].Cells["cli_discapacitado"].Value.ToString().Trim().ToUpper() == "SI")
            {
                tablaDetallePago.Rows[vecAcompaniante[cbAcompanianteDiscap.SelectedIndex]].Cells["bonificacion"].Value = "Pasaje sin cargo por discapacidad";
                tablaDetallePago.Rows[vecAcompaniante[cbAcompanianteDiscap.SelectedIndex]].Cells["precio"].Value = 0;
            }
            else
            {
                tablaDetallePago.Rows[vecAcompaniante[cbAcompanianteDiscap.SelectedIndex]].Cells["bonificacion"].Value = "Pasaje sin cargo por acomp. de discapacitado";
                tablaDetallePago.Rows[vecAcompaniante[cbAcompanianteDiscap.SelectedIndex]].Cells["precio"].Value = 0;
            }

            //Recalcular precio
            recalcularPrecioPago();

            //No permiter seleccionar otro, y permitir aceptar la compra
            buConfAcompaniante.Enabled = false;
            cbAcompanianteDiscap.Enabled = false;
            buConfimarCompra.Enabled = true;
        }

        //Vuelve a calcular el precio total de la tabla de detalle de pagos
        private void recalcularPrecioPago()
        {
            decimal precioTotal = 0;

            //Recorrer y procesar la tabla de pasajeros/encomiendas
            for (int x = 0; x < tablaPasajeros.Rows.Count; x++)
            {
                precioTotal += decimal.Parse(tablaDetallePago.Rows[x].Cells["precio"].Value.ToString());
            }

            txPagoPrecioTotal.Text = precioTotal.ToString("#.##");    //Formatear precio, mostrar solo 2 decimales
        }

        private void buTarjetasLimpiar_Click(object sender, EventArgs e)
        {
            //Borra todos los datos de la tarjeta
            txPagoNroTarj.Text = "";
            txPagoCodSeg.Text = "";
            txPagoFechaVenc.Text = "";
            cbTipoTarjeta.SelectedIndex = -1;
            txPagoCuotas.Text = "";
        }

        //Consultar datos de la tarjeta en la BD, y si se encuentra los carga
        private void buVerificarTarjeta_Click(object sender, EventArgs e)
        {
            long nroTarjeta;
            string query;
            string carTtipoTarj;

            //Validar nro de tarjeta
            txPagoNroTarj.Text.Trim();
            if (txPagoNroTarj.Text == ""){
                MessageBox.Show("Introduzca el número de tarjeta","Consultar datos de tarjeta");
                return;
            }
            if (!long.TryParse(txPagoNroTarj.Text, out nroTarjeta))
            {
                MessageBox.Show("El número de tarjeta debe ser numérico","Consultar datos de tarjeta");
                return;
            }

            //Consultar BD
            query = "select * from THE_BEST_IAS.tarjetas where tarj_nro = " + nroTarjeta.ToString();
            SqlDataReader dr = DbHelper.ExecuteQuery(query);

            //Mostrar datos, si se encontraron
            if (dr.HasRows)
            {
                dr.Read();

                //Validar que la tarjeta pertenezca al usuario
                if (long.Parse(dr["usu_codigo"].ToString()) != long.Parse(txPagoDni.Text))
                {
                    MessageBox.Show("La tarjeta indicada no pertenece al cliente", "Consultar datos de tarjeta");
                    return;
                }

                txPagoCodSeg.Text = dr["tarj_codigo_seguridad"].ToString().Trim();
                txPagoFechaVenc.Text = DateTime.Parse(dr["tarj_fecha_venc"].ToString().Trim()).ToShortDateString();

                carTtipoTarj = dr["tarj_codigo_seguridad"].ToString().Trim();
                if (carTtipoTarj == "D")
                {
                    cbTipoTarjeta.SelectedIndex = 0;   //Elemento 0: "Débito"
                }
                else if (carTtipoTarj == "C")
                {
                    cbTipoTarjeta.SelectedIndex = 1;   //Elemento 1: "Crédito"
                }
                else
                {
                    cbTipoTarjeta.SelectedIndex = -1;   //Sin datos
                }
            }
            else
            {
                MessageBox.Show("No se encontro la tarjeta", "Consultar datos de tarjeta");
            }
        }

        //Si la tarjeta seleccionada es la de crédito permitir seleccionar las cuotas
        private void cbTipoTarjeta_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbTipoTarjeta.SelectedIndex == 1)
                txPagoCuotas.Enabled = true;
            else
                txPagoCuotas.Enabled = false;
        }

        //Registra la compra, creando todos los registros necesarios en la BD
        private void buConfimarCompra_Click(object sender, EventArgs e)
        {
            string msjError ="";
            long codCompra;
            long codLineaCompra;

            //Validar datos
            //Si hay discapacitado, verificar que se haya seleccionado un acompañante, de corresponder
            if (buConfAcompaniante.Enabled && buConfAcompaniante.Visible)
            {
                msjError += "\nSeleccione el acompañante o la persona que viajará sin cargo";
            }

            //Verificar que se haya seleccionado un medio de pago
            if (!rdPagoEfectivo.Checked && !rdPagoTarjeta.Checked)
            {
                msjError += "\nSeleccione la forma de pago, efectivo o tarjeta";
            }

            //Validar datos de la tarjeta, si selecciono este medio de pago
            if (rdPagoTarjeta.Checked)
            {
                msjError += validarTarjeta();
            }

            //Informar en caso de error
            if (msjError != "")
            {
                MessageBox.Show("Se encontraron los siguientes errores:" + msjError);
                return;
            }

            //Preaparar Stored Procedure
            string sConnectionString = Settings.Default.GD1C2013ConnectionString;
            SqlConnection connection = new SqlConnection(sConnectionString);

            //Según el caso que sea alta o modificación
            SqlCommand cmd;


            //Registrar/actualizar tarjeta si corresponde
            if (rdPagoTarjeta.Checked)
            {
                cmd = new SqlCommand("THE_BEST_IAS.pr_registrar_tarjeta", connection);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add(new SqlParameter("@p_tarj_nro", SqlDbType.BigInt)).Value = txPagoNroTarj.Text;
                cmd.Parameters.Add(new SqlParameter("@p_tarj_codigo_seguridad", SqlDbType.Int)).Value = txPagoCodSeg.Text;

                if (cbTipoTarjeta.SelectedIndex ==0)
                    cmd.Parameters.Add(new SqlParameter("@p_tarj_tipo", SqlDbType.NVarChar)).Value = "D";
                else
                    cmd.Parameters.Add(new SqlParameter("@p_tarj_tipo", SqlDbType.NVarChar)).Value = "C";
                
                cmd.Parameters.Add(new SqlParameter("@p_usu_codigo", SqlDbType.BigInt)).Value = txPagoDni.Text;
                cmd.Parameters.Add(new SqlParameter("@p_tarj_fecha_venc", SqlDbType.DateTime)).Value = txPagoFechaVenc.Text;

                connection.Open();
                if (cmd.ExecuteNonQuery() == 0) //Ejecuta la consulta y devuelve la cant. de filas afectadas
                {  
                    MessageBox.Show("No se pudo registrar la tarjeta", "Pago");
                    connection.Close();
                    return;
                }
                connection.Close();
            }


            //Registrar compra y obtener el 'codigo de compra'
            cmd = new SqlCommand("THE_BEST_IAS.pr_generar_compra", connection);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@p_via_codigo", SqlDbType.BigInt)).Value = codViaje;
            cmd.Parameters.Add(new SqlParameter("@p_usu_codigo", SqlDbType.BigInt)).Value = txPagoDni.Text;
            cmd.Parameters.Add(new SqlParameter("@p_comp_fecha", SqlDbType.DateTime)).Value = Fechas.fechaSistema.ToShortDateString();  //Fecha del archivo de configuración
            cmd.Parameters.Add(new SqlParameter("@p_comp_importe", SqlDbType.Decimal)).Value = txPagoPrecioTotal.Text;

            if (rdPagoEfectivo.Checked)
            {
                cmd.Parameters.Add(new SqlParameter("@p_comp_forma_pago", SqlDbType.NVarChar)).Value = "E";
                cmd.Parameters.Add(new SqlParameter("@p_tarj_nro", SqlDbType.BigInt)).Value = System.Data.SqlTypes.SqlInt64.Null;            //No incluir datos de tarjeta
                cmd.Parameters.Add(new SqlParameter("@p_comp_cant_cuotas", SqlDbType.Int)).Value = System.Data.SqlTypes.SqlInt32.Null;
            }
            else
            {
                cmd.Parameters.Add(new SqlParameter("@p_comp_forma_pago", SqlDbType.NVarChar)).Value = "T";
                cmd.Parameters.Add(new SqlParameter("@p_tarj_nro", SqlDbType.BigInt)).Value = txPagoNroTarj.Text;
                
                if (cbTipoTarjeta.SelectedIndex ==1)
                    cmd.Parameters.Add(new SqlParameter("@p_comp_cant_cuotas", SqlDbType.Int)).Value = txPagoCuotas.Text;
                else
                    cmd.Parameters.Add(new SqlParameter("@p_comp_cant_cuotas", SqlDbType.Int)).Value = System.Data.SqlTypes.SqlInt32.Null;

            }
            
            //Retorno
            cmd.Parameters.Add("@p_comp_codigo", SqlDbType.BigInt).Direction = ParameterDirection.Output;
            cmd.CommandTimeout = 1000;

            //Consultar
            connection.Open();
            try
            {
                if (cmd.ExecuteNonQuery() > 0)
                {  //Ejecuta la consulta y devuelve la cant. de filas afectadas

                    //Obtener código de compra
                    codCompra = Convert.ToInt64(cmd.Parameters["@p_comp_codigo"].Value);
                    connection.Close();
                }
                else
                {
                    MessageBox.Show("No se pudo registrar la compra", "Pago");
                    connection.Close();
                    return;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("No se pudo registrar la compra: " + ex.Message, "Pago");
                connection.Close();
                return;
            }

            //Escribir el voucher en el comprobante
            txVoucher.Text = codCompra.ToString();

            //Registrar cada una de las lineas de la compra (Pasajeros/Encomiendas)
            for (int x = 0; x < tablaDetallePago.Rows.Count; x++)
            {
                cmd = new SqlCommand("THE_BEST_IAS.pr_agregar_item_compra", connection);
                cmd.CommandType = CommandType.StoredProcedure;

                if (tablaDetallePago.Rows[x].Cells["enc_peso"].Value.ToString() == "-")
                {
                    //Pasajero
                    cmd.Parameters.Add(new SqlParameter("@p_coit_tipo", SqlDbType.NVarChar)).Value = "P";
                    cmd.Parameters.Add(new SqlParameter("@p_but_codigo", SqlDbType.BigInt)).Value =
                        tablaPasajeros.Rows[x].Cells["but_codigo"].Value.ToString();                    //No figura en la tabla de detalle de pago
                    cmd.Parameters.Add(new SqlParameter("@p_enc_peso", SqlDbType.Decimal)).Value = System.Data.SqlTypes.SqlDecimal.Null;
                }
                else
                {
                    //Encomienda
                    cmd.Parameters.Add(new SqlParameter("@p_coit_tipo", SqlDbType.NVarChar)).Value = "E";
                    cmd.Parameters.Add(new SqlParameter("@p_but_codigo", SqlDbType.BigInt)).Value = System.Data.SqlTypes.SqlInt32.Null;
                    cmd.Parameters.Add(new SqlParameter("@p_enc_peso", SqlDbType.Decimal)).Value =
                        tablaDetallePago.Rows[x].Cells["enc_peso"].Value.ToString();

                }

                cmd.Parameters.Add(new SqlParameter("@p_coit_importe", SqlDbType.Decimal)).Value =
                    tablaDetallePago.Rows[x].Cells["precio"].Value.ToString();
                cmd.Parameters.Add(new SqlParameter("@p_comp_codigo", SqlDbType.BigInt)).Value = codCompra;
                cmd.Parameters.Add(new SqlParameter("@p_usu_codigo", SqlDbType.BigInt)).Value = txPagoDni.Text;

                //Retorno
                cmd.Parameters.Add("@p_coit_codigo", SqlDbType.BigInt).Direction = ParameterDirection.Output;
                cmd.CommandTimeout = 1000;

                //Consultar
                connection.Open();

                if (cmd.ExecuteNonQuery() > 0)
                {  //Ejecuta la consulta y devuelve la cant. de filas afectadas

                    //Obtener código de compra
                    codLineaCompra = Convert.ToInt64(cmd.Parameters["@p_coit_codigo"].Value);

                    //Escribir en la tabla de comprobante
                    tablaComprobante.Rows.Add(new object[] { 
                           tablaDetallePago.Rows[x].Cells["tipo"].Value.ToString(),
                           tablaDetallePago.Rows[x].Cells["cli_dni"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["but_codigo"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["but_tipo"].Value.ToString(),
                           tablaPasajeros.Rows[x].Cells["but_piso"].Value.ToString(),
                           tablaDetallePago.Rows[x].Cells["enc_peso"].Value.ToString(),
                           tablaDetallePago.Rows[x].Cells["precio"].Value.ToString(),
                           codLineaCompra.ToString()
                         });
                }
                else
                {
                    MessageBox.Show("No se pudo registrar el pasajero " + tablaDetallePago.Rows[x].Cells["cli_alias"].Value.ToString() + " en la compra", "Pago");
                    connection.Close(); ////Deberia cancelarse la compra
                    return;
                }
                connection.Close();
            }

            //Exito
            MessageBox.Show("Se registro la compra " + codCompra.ToString(), "Pagos");

            //Mostrar frame de comprobante de compra
            grComprobante.Visible = true;
            grDatosPago.Visible = false;
        }

        //Validar tarjeta
        private string validarTarjeta()
        {
            string msjError = "";
            long nroTarjeta;

            //Validar nro de tarjeta
            txPagoNroTarj.Text.Trim();
            if (txPagoNroTarj.Text == ""){
                msjError += "\nIntroduzca el número de tarjeta";
            }else if (!long.TryParse(txPagoNroTarj.Text, out nroTarjeta))
            {
                msjError += "\nEl número de tarjeta debe ser numérico";
            }

            //Validar código de seguridad
            txPagoCodSeg.Text.Trim();
            if (txPagoCodSeg.Text == ""){
                msjError += "\nIntroduzca el código de seguridad";
            }else if (txPagoCodSeg.Text.Length != 3){
                msjError += "\nEl código de seguridad debe ser de 3 digitos";
            }else if (!long.TryParse(txPagoCodSeg.Text, out nroTarjeta))
            {
                msjError += "\nEl número de tarjeta debe ser numérico y de 3 digitos";
            }

            //Validar fecha ////Deberia validar que no este vencida
            if (txPagoFechaVenc.Text == ""){
                msjError += "\nSeleccione la fecha de vencimiento";
            }

            //Validar tipo de tarjeta
            if (cbTipoTarjeta.SelectedIndex == -1){
                msjError += "\nSeleccione el tipo de tarjeta";
            }

            //Si el tipo de tarjeta es la de crédito, validar la cantidad de cuotas
            if (cbTipoTarjeta.SelectedIndex == 1){
                //Validar cuotas
                txPagoCuotas.Text.Trim();
                if (txPagoCuotas.Text == "")
                {
                    msjError += "\nIntroduzca la cantidad de cuotas";
                }
                if (!long.TryParse(txPagoCuotas.Text, out nroTarjeta))
                {
                    msjError += "\nLa cantidad de cuotas debe ser numérico y positivo";
                }
                else if (nroTarjeta < 1)
                {
                    msjError += "\nLa cantidad de cuotas debe ser mayor a cero";
                }
            }

            //Devolver cadena con los posibles errores
            return msjError;
        }

        private void calendarioTarj_DateChanged(object sender, DateRangeEventArgs e)
        {
            //Obtener la fecha
            txPagoFechaVenc.Text = calendarioTarj.SelectionEnd.ToShortDateString();
        }

        private void calendarioTarj_Leave(object sender, EventArgs e)
        {
            //Hacer invisible si pierde el foco
            calendarioTarj.Hide();
        }

        //Fecha de vencimiento de la tarjeta
        private void buSelFechaVenTar_Click(object sender, EventArgs e)
        {
            calendarioTarj.Visible = true;
            calendarioTarj.Focus();
        }

        //Carga los pasajeros de la tabla de pasajeros/encomiendas en la lista para determinar quien paga
        private void cargarListaPago()
        {
            for (int x = 0; x < tablaPasajeros.Rows.Count; x++)
            {
                lsSelPasajeroPago.Items.Add(tablaPasajeros.Rows[x].Cells["cli_nombre"].Value.ToString() + ", " +
                    tablaPasajeros.Rows[x].Cells["cli_apellido"].Value.ToString() + " (DNI: " +
                    tablaPasajeros.Rows[x].Cells["cli_dni"].Value.ToString() + ") - " +
                    tablaPasajeros.Rows[x].Cells["tipo"].Value.ToString());
            }
        }

        //Escribe el dni del pasajero seleccionado
        private void lsSelPasajeroPago_SelectedIndexChanged(object sender, EventArgs e)
        {
            txDni.Text = tablaPasajeros.Rows[lsSelPasajeroPago.SelectedIndex].Cells["cli_dni"].Value.ToString();
        }

    }
}
